package model.arbolBSharp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;


public class ConversorBytesNodo extends ConversorBytes{

	private Nodo nodo;
	private ConversorBytesTexto empTexto = new ConversorBytesTexto();

	public Nodo getNodo() {
		return nodo;
	}

	public void setNodo(Nodo datosNoHoja) {
		this.nodo = datosNoHoja;
	}
	
	@Override
	public void convertirAObjetos(InputStream i) throws IOException {
		if (i==null)
			throw new NullPointerException();
		
		DataInputStream input = new DataInputStream(i);
		
		//Nivel
		int nivel = input.readInt();		
		if (nivel <= 0)
			throw new IOException("Es un nodo hoja");
		
		//Posicion
		int posicion = input.readInt();
		
		//Cantidad de items
		int cantidadClaves = input.readInt();		
		if (cantidadClaves==0)
			throw new IOException("Error al descomprimir el nodo");
		
		//Claves
		empTexto.setCantidadAConvertir(cantidadClaves);
		empTexto.convertirAObjetos(i);
		List<String> listaClaves = empTexto.getListaStrings();
		
		//Punteros
		int[] arrayPunteros = new int[cantidadClaves];
		for(int j=0; j<cantidadClaves; j++){
			arrayPunteros[j]=input.readInt();
		}
				
		List<Integer> listaPunteros = new ArrayList<Integer>(cantidadClaves);
		for(int j=0; j<arrayPunteros.length; j++){
			listaPunteros.add(new Integer(arrayPunteros[j]));
		}
		
		this.nodo = new Nodo(listaClaves, listaPunteros, posicion, nivel);		
	}

	@Override
	public void convertirABytes(OutputStream o) throws IOException {
		if(o == null)
			throw new NullPointerException("output stream");
		
		if(nodo==null)
			throw new NullPointerException("nodo");
		
		if(nodo.getNivel()==null)
			throw new NullPointerException("nivel");
		
		if(nodo.getPosicionEnArchivo()==null)
			throw new NullPointerException("posicion en archivo");
		
		if(nodo.getListaClaves()==null)
			throw new NullPointerException("lista prefijos");
		
		if(nodo.getListaPunteros()==null)
			throw new NullPointerException("lista punteros");
		
		int cantidadClaves = nodo.getListaClaves().size();
		int cantidadPunteros = nodo.getListaPunteros().size();
		if(cantidadClaves <= 0 || cantidadPunteros != cantidadClaves)
			throw new IOException("El nodo debe tener n>0 prefijos y la misma cantidad de punteros");
		
		
		DataOutputStream out = new DataOutputStream(o);
		//Nivel
		out.writeInt(nodo.getNivel());
		
		//Posicion
		out.writeInt(nodo.getPosicionEnArchivo());
		
		//Cantidad items		
		out.writeInt(cantidadClaves);
		
		int[] arrayPunteros = new int[cantidadPunteros];		
		for(int i=0; i<cantidadPunteros; i++)
			arrayPunteros[i] = nodo.getListaPunteros().get(i);
		
		//Claves
		empTexto.setListaStrings(nodo.getListaClaves());
		empTexto.convertirABytes(o);
		
		//Punteros
		for(int i=0; i<arrayPunteros.length; i++){
			out.writeInt(arrayPunteros[i]);
		}
	}

}
